class DecodedMessage {
    constructor(type, content) {
        this.type = type;
        this.content = content;
    }
}

const HEADER_LENGTH = 5;

/**
 * 将 JSON 消息封装为带协议头的 Buffer
 * @param {number} type - 消息类型（1字节）
 * @param {Buffer} content - 消息体内容
 * @returns {Buffer} 带协议头的完整数据包
 */
function encode(type, content) {
    const buffer = Buffer.alloc(HEADER_LENGTH + content.length);
    buffer.writeInt32BE(content.length, 0); // 写入消息体长度
    buffer.writeUInt8(type, 4);             // 写入消息类型
    content.copy(buffer, HEADER_LENGTH);    // 写入消息体
    return buffer;
}

/**
 * 从缓冲区中解析完整消息（支持粘包/拆包）
 * @param {Buffer} buffer - 接收到的数据缓冲区
 * @returns {DecodedMessage|null} 解析后的消息对象，若数据不足则返回 null
 */
function decode(buffer) {
    if (buffer.length < HEADER_LENGTH) {
        return null; // 数据不足，等待下次读取
    }

    const length = buffer.readInt32BE(0);
    const type = buffer.readUInt8(4);
    const expectedSize = HEADER_LENGTH + length;

    if (buffer.length < expectedSize) {
        return null; // 数据不完整，等待后续数据
    }

    const content = Buffer.alloc(length);
    buffer.copy(content, 0, HEADER_LENGTH, HEADER_LENGTH + length);
    return new DecodedMessage(type, content);
}

module.exports = {
    encode,
    decode
};